package com.medsys.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;

import com.medsys.model.Funcionario;
import com.medsys.model.Paciente;

/**
 * Classe para acesso ao banco de dados da classe {@link Funcionario}.
 * @author Felipe Lauksas
 *
 */
public class FuncionarioDAO extends BaseDAO {
	/**
	 * Contrutor passando uma {@link Session} que ser� utilizada na super classe {@link BaseDAO}.
	 * @param session criada por {@link DAOFactory}.
	 */
	public FuncionarioDAO(Session session) {
		super(session);		
	}	
	
	/**
	 * M�todo para salvar um objeto do tipo {@link Funcionario} no banco de dados. 
	 * @param funcionario
	 * @return {@link Funcionario} persistido.
	 * @throws Exception
	 */
	public Funcionario salvar (Funcionario funcionario) throws Exception{
		try {
			funcionario = (Funcionario) this.session.merge(funcionario);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return funcionario;
	}
	/**
	 * Altera um funcion�rio.
	 * @param funcionario do tipo {@link Funcionario}.
	 * @throws Exception
	 */
	public void alterar(Funcionario funcionario) throws Exception{
		try {
			this.session.update(funcionario);
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
	}
	/**
	 * M�todo para retornar todos funcion�rios do banco de dados.
	 * @return {@link List} com objetos do tipo {@link Funcionario}.
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public List<Funcionario> listarTodos() throws Exception{
		List<Funcionario> listFuncionarios = null;
		try {
			listFuncionarios = this.session.createCriteria(Funcionario.class).list();
		} catch (HibernateException e) {			
			throw new Exception(e);
		}
		return listFuncionarios;
	}
	
	/**
     * Pesquisa um Funcionario pela sua chave
     * @param Integer id
     * @return {@link Funcionario} funcionario
     */
    public Funcionario pesquisarPorId(Serializable id)throws Exception{  
    	
    	Funcionario funcionario = null;
    	
        try {
        	
		    funcionario =  (Funcionario) this.session.get(Funcionario.class, id);
			
		} catch (HibernateException e) {
			
			throw new  Exception(e);
		}
		
		return funcionario;
    }
    
    /**
     * Pesquisa um Funcionario pelo CPF
     * @param crm
     * @return {@link Paciente} paciente
     */
    public Funcionario pesquisarPorCpf(String cpf)throws Exception{            
        
        Funcionario funcionario = null;
    	
        try {
        	
        	Query query = this.session.createQuery("select f from Funcionario f where f.cpf = "+cpf);
        	
		    funcionario =  (Funcionario) query.uniqueResult();
			
		} catch (HibernateException e) {
			
			throw new  Exception(e);
		}	
        
        return funcionario;
    }
}
